package bo;

import IBO.IClientSociete;
import IBO.IForme;
import boerrors.ClientSocieteInexistantException;
import dao.AbstractFactory;
import dao.dto.AdresseDto;
import dao.dto.ClientSocieteDto;
import dao.dto.FormeDto;
import boerrors.AdresseMinimumMultiplicityException;
import boerrors.ClientSocieteExistantException;
import boerrors.CodePostalMinimumMultiplicityException;
import boerrors.FormeMinimumMultiplicityException;
import boerrors.ZoneMinimumMultiplicityException;
import dao.dto.CodePostalDto;
import dao.dto.ZoneDto;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.Util;

public class ClientSociete extends Client implements IClientSociete, Cloneable{
        private String _nomSociete;
        private Forme _forme;

	//*******************************************************************
	//Constructeurs
	//*******************************************************************
        
        public ClientSociete (ClientSocieteDto clientS) throws RemoteException{
                //Obligation de mettre un super en premier, donc instanciation sans l'objet Adresse qui a encore besoin d'être convertit
                super(clientS.getNom(), clientS.getPrenom(), clientS.getTelephone(), clientS.getEmail(), clientS.getIdClient(), clientS.getNumeroTVA());             
                //Convertion de l'objet AdresseDto en Adresse
                Adresse adresse = new Adresse(clientS.getAdresse());
                //Ajout de l'objet Adresse
                this.setAdresse(adresse);
                this._nomSociete = clientS.getNomSociete();
                this._forme = new Forme(clientS.getForme());
                UnicastRemoteObject.exportObject(this, 0);            
       }
        
        public ClientSociete(   String nom, String prenom, Adresse adresse,
                                String telephone, String email, String numeroTVA,
                                String nomSociete, Forme forme) throws RemoteException {
                super(nom, prenom, adresse, telephone, email, numeroTVA);
                try {
                    setNomSociete(nomSociete);
                    enregistrerForme(forme);
                    int idClient;
                    idClient = AbstractFactory.getInstance().getClientSocieteDao().enregistrer(creerClientSocieteDto());
                    this.setIdClient(idClient);
                    ListeClients.getInstance().ajouterClientSociete(this);
                    UnicastRemoteObject.exportObject(this, 0);
                } catch (FormeMinimumMultiplicityException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                } catch (AdresseMinimumMultiplicityException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                } catch (CodePostalMinimumMultiplicityException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ZoneMinimumMultiplicityException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ClientSocieteExistantException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                }
        }

        public ClientSociete(   String nom, String prenom, Adresse adresse, 
                                String telephone, String email,String nomSociete, Forme forme) throws RemoteException {
                super(nom, prenom, adresse, telephone, email);
                try {
                    setNomSociete(nomSociete);
                    enregistrerForme(forme);
                    int idClient;
                    idClient = AbstractFactory.getInstance().getClientSocieteDao().enregistrer(creerClientSocieteDto());
                    this.setIdClient(idClient);
                    ListeClients.getInstance().ajouterClientSociete(this);
                    UnicastRemoteObject.exportObject(this, 0);
                } catch (FormeMinimumMultiplicityException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                } catch (AdresseMinimumMultiplicityException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                } catch (CodePostalMinimumMultiplicityException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ZoneMinimumMultiplicityException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ClientSocieteExistantException ex) {
                    Logger.getLogger(ClientSociete.class.getName()).log(Level.SEVERE, null, ex);
                }
        }

        public ClientSociete(   int idClient, String nom, String prenom, Adresse adresse, String telephone, String email, 
                                String nomSociete, Forme forme) throws RemoteException {
                super(nom, prenom, adresse, email, telephone, idClient);
                setNomSociete(nomSociete);
                enregistrerForme(forme);
                UnicastRemoteObject.exportObject(this, 0);
        }

        public ClientSociete(   int idClient, String nom, String prenom, Adresse adresse,String telephone, String email, 
                                String numeroTVA, String nomSociete, Forme forme) throws RemoteException {
                super(nom, prenom, adresse, email, telephone, idClient, numeroTVA);
                setNomSociete(nomSociete);
                enregistrerForme(forme);
                UnicastRemoteObject.exportObject(this, 0);
        }
        
        private ClientSocieteDto creerClientSocieteDto() throws RemoteException, FormeMinimumMultiplicityException, 
                                                                AdresseMinimumMultiplicityException, 
                                                                CodePostalMinimumMultiplicityException, 
                                                                ZoneMinimumMultiplicityException {
                 ZoneDto zTampon = new ZoneDto(this.getAdresse().getCodePostal().getZone().getIdZone(), this.getAdresse().getCodePostal().getZone().getLibelleZone());
                 CodePostalDto cpTampon = new CodePostalDto(this.getAdresse().getCodePostal().getIdCodePostal(), this.getAdresse().getCodePostal().getCodePostal(), this.getAdresse().getCodePostal().getVille(), this.getAdresse().getCodePostal().getPays(), zTampon);
                 AdresseDto adresse = new AdresseDto(this.getAdresse().getIdAdresse(), this.getAdresse().getRue(), this.getAdresse().getNumero(), cpTampon);
                 FormeDto forme = this.getForme().creerFormeDto();
                 return new ClientSocieteDto(this.getIdClient(), this.getNom(), this.getPrenom(), adresse, this.getTelephone(), this.getEmail(), this.getNomSociete(), forme);
        }

	//*******************************************************************
	//Setters
	//*******************************************************************
        
        public synchronized void setNomSociete(String nomSociete) {
                Util.checkString(nomSociete);
                this._nomSociete=nomSociete;
        }
        
        //*******************************************************************
	//Getters
	//*******************************************************************
        
        public synchronized String getNomSociete() throws RemoteException {
                return _nomSociete;
        }

        public synchronized Forme getForme() throws RemoteException, FormeMinimumMultiplicityException {
                if (! aUneFormeValide()) throw new FormeMinimumMultiplicityException();
		return _forme;
        }
        
        public synchronized IForme getIForme() throws RemoteException, FormeMinimumMultiplicityException{
                if (! aUneFormeValide()) throw new FormeMinimumMultiplicityException();
		return _forme;            
        }
        
	//*******************************************************************
	//Associations
	//*******************************************************************
        
        public synchronized boolean enregistrerForme(Forme forme) {
                if (this._forme == forme) return false;
		if (! peutEnregistrerForme()) return false;
		this._forme = forme;
		return true;
	}
        // clone modifier societe forme
        public synchronized boolean enregistrerFormeClone(Forme forme) {
                if (this._forme == forme) return false;
		if ( peutEnregistrerForme()) return false;
		this._forme = forme;
		return true;
	}

        //Aucune suppression de la forme n'est autorisée

        private synchronized boolean peutEnregistrerForme() {
                return this._forme == null;
	}
        
        public synchronized boolean aUneFormeValide() {
                return this._forme != null;
        }

	//*******************************************************************
	//Methodes static
	//*******************************************************************
        
        public synchronized static Vector<ClientSociete> lister() throws RemoteException, ClientSocieteInexistantException {
                Vector<ClientSocieteDto> listeClientSDto = AbstractFactory.getInstance().getClientSocieteDao().lister();
                Vector<ClientSociete> listeClient = new Vector<ClientSociete>();
                for (int i = 0; i < listeClientSDto.size(); i++) {
                    ClientSocieteDto clDto = listeClientSDto.get(i);
                    listeClient.add(new ClientSociete(clDto));
                }
                return listeClient;
        }
        
        public synchronized static void modifier(ClientSociete client) throws   RemoteException, 
                                                                                ClientSocieteInexistantException, 
                                                                                FormeMinimumMultiplicityException, 
                                                                                AdresseMinimumMultiplicityException, 
                                                                                CodePostalMinimumMultiplicityException, 
                                                                                ZoneMinimumMultiplicityException{
                AbstractFactory.getInstance().getClientSocieteDao().modifier(client.creerClientSocieteDto());
        }
        
        //*******************************************************************
	//Method Clonable
	//*******************************************************************        
        
        @Override
        public Object clone(){
            // On récupère l'instance à renvoyer par l'appel de la 
	    // méthode super.clone() (ici : Personne.clone())
             ClientSociete clientSociete = (ClientSociete) super.clone();
            // on renvoie le clone
            return clientSociete;
        }        
}